﻿#pragma once

#include <QObject>
#include <QSerialPort>
#include <qpushbutton.h>
#include "CoreData.h"
#include "NewPCIDemoDefine.h"

namespace HSS {

	struct PortInformation
	{
		QString portName;
		QSerialPort::BaudRate baudRate;
		QSerialPort::DataBits dataBits;
		QSerialPort::Parity parity;
		QSerialPort::StopBits stopBits;
		QSerialPort::FlowControl flowCtr = QSerialPort::NoFlowControl;
		//QByteArray message;
	};


}

//quint16 crc16(const quint8 *data, quint16 len)
//{
//	quint16 crc = 0xFFFF;
//	for (quint8 i = 0; i < len; i++)
//	{
//		crc ^= data[i];
//		for (int j = 0; j < 8; j++)
//		{
//			quint16 carry_flag = crc & 0x0001;
//			crc >>= 1;
//			if (carry_flag)
//			{
//				crc ^= 0xA001;
//			}
//		}
//	}
//	return crc;
//}


//帧头 1B
//指令 1B
//帧长 1B
//数据  B
//CRC16校验码 2B
class Communicator  : public QObject
{
	Q_OBJECT

public:
	Communicator(QObject *parent = nullptr);
	~Communicator();

	void setPortInformation(HSS::PortInformation portInfo);		
	//void sendData();
	//打开通道接收硬件信息
	//void openToReceiveMsg();

	//硬件初始化
	void sendInitInfo();
	//开始扫描
	void sendStartInfo();
	//停止扫描
	void sendStopInfo();
	//
	void sendRowInfo(int frequency,int rowNum);
	//
	void sendExpandInfo(int expandValue);
	//
	void sendImgNumInfo(int imgNum);

	quint16 calculateCRC16(const QByteArray &data);

	QString convertToByte(int value);

public slots:
	

signals:
	//发送结束信号
	void oneHeightDataEnd();

private:
	void init();
	void initIniInfo();
	void initStartInfo();
	void initStopInfo();
	void setSerialPort();
	void readReturnInfo(QByteArray backInfo);
private:
	QSerialPort m_serialPort;
	HSS::PortInformation m_portInfo;
	QByteArray m_initInfo;
	QByteArray m_startInfo;
	QByteArray m_stopInfo;
	QByteArray m_rowInfo;
	QByteArray m_expandInfo;
	QByteArray m_imgNumInfo;
};
